package com.atguigu.lease.web.admin.converter;

import com.atguigu.lease.model.enums.BaseEnum;
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.convert.converter.ConverterFactory;
import org.springframework.stereotype.Component;

@Component
public class StringToBaseEnumConvertorFactory implements ConverterFactory<String, BaseEnum> {
    /**
     * 获取一个转换器，用于将字符串转换为指定的枚举类型
     * 此方法是泛型的，可以适用于任何继承自BaseEnum的枚举类型
     * 它通过反射获取枚举常量，并根据枚举常量的代码值与输入字符串进行匹配
     * 如果找到匹配，则返回对应的枚举实例；如果没有找到匹配，则返回null
     *
     * @param targetType 目标枚举类型的Class对象，用于反射获取枚举常量
     * @param <T>        泛型参数，表示任何继承自BaseEnum的枚举类型
     * @return 返回一个Converter实例，可以将字符串转换为指定的枚举类型
     */
    @Override
    public <T extends BaseEnum> Converter<String, T> getConverter(Class<T> targetType) {
        // 创建并返回一个Lambda表达式实例化的Converter
        Converter converter = (source) -> {
            // 获取目标枚举类型的所有枚举常量
            T[] enumConstants = targetType.getEnumConstants();
            // 检查枚举常量是否非空且长度大于0
            if (enumConstants != null && enumConstants.length > 0){
                // 遍历所有枚举常量
                for (T enumConstant : enumConstants){
                    // 如果源字符串与枚举常量的代码值匹配，则返回该枚举常量
                    if (source.equals(String.valueOf(enumConstant.getCode()))){
                        return enumConstant;
                    }
                }
            }
            // 如果没有找到匹配的枚举常量，返回null
            return null;
        };
        // 返回Lambda表达式实例化的Converter
        return converter;

    }
}
